/*
 * @Author: OreoWang
 * @Email: ihc523@163.com
 * @Date: 2020-06-01 12:05:23
 * @LastEditors: OreoWang
 * @LastEditTime: 2022-08-10 16:35:58
 * @Description: 模型绑定模板编译对象
 */

import IViewTemplate from "./IViewTemplate";
import ViewModel, { ViewData } from "./ViewModel";
import ViewController from "./ViewController";
import ViewNode from "./ViewNode";
    
export default interface IViewRender {
    data: ViewData;           // 原始数据模型（必需）
    template: IViewTemplate;    // 数据绑定模板（必需）

    //（以下属性方法中的this默认均指向当前IViewRender对象）
    computed?: {[propName: string]: Function | {get: Function, set: Function}}; // 计算属性（可选）
    watch?: {[propName: string]: Function};     // 监听属性，优先级比计算属性高（可选）
    methods?: {[propName: string]: Function};   // 模型对象实例方法（可选）
}

/**
 * 模型绑定模板编译示例
 * @param view 
 * @param data 
 *
    let _compile = (controller: ViewController, view: ViewNode, data: ViewData): IViewRender =>{ 
        let data = data;
        return {
            // 原始数据模型（必需）
            data: data ? data : {
                'data_key1': "default_value",
                'data_key2': "default_value",
                'computed_key1': "no_value",  //计算属性一般是只读属性，在 data 中可以不定义(区别是定义后 data.computed_key1 有智能提示)，但必须要在 computed 中定义。
            },
            // 数据绑定模板(key与节点组件绑定，支持单个key绑定多个节点)（必需）
            template: {
                'data_key1': view['xxx'], //view.xxx 
                'data_key2': view.xxx,
                'computed_key1': [view.xxx1, view.xxx2], 
            },
            // 绑定计算属性(可选)
            computed: {
                // computed_key1 的值通过引用依赖计算 data.data_key1 和 data.data_key2 得到，data 中相应的值改变时，计算属性结果也会改变
                'computed_key1': function (vm: ViewData) {
                    return vm.data_key1 + '-' + vm.data_key2;
                },
            },
            // 监听属性(可选)
            watch: {
                // data 中的 data_key1 值发生改变时触发此监听回调
                'data_key1': function(value: any, oldValue: any) {
                    //（render属性方法中的this默认均指向当前IViewRender对象）
                    this.onValueChange('data_key1', value, oldValue);
                }
            },
            // 模型对象实例方法(可选)
            methods: {
                onValueChange(key: string, value: any, oldValue: any){
                    console.warn("methods.onValueChange: ", key, value, oldValue);
                }
            }
        }
    };
//*/